/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package session;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import tp3.CompteBancaire;

/**
 *
 * @author Aurelie
 */
@Stateless
public class CompteBancaireFacade extends AbstractFacade<CompteBancaire> {

    @PersistenceContext(unitName = "TP3BanqueTournesFolacci-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public CompteBancaireFacade() {
        super(CompteBancaire.class);
    }

    public CompteBancaire creerCompte(CompteBancaire c) {
        create(c);
        return c;
    }

    public void creerComptesTest() {
        creerCompte(new CompteBancaire("John Lennon", 150000));
        creerCompte(new CompteBancaire("Paul Cartney", 950000));
        creerCompte(new CompteBancaire("Ringo Starr", 20000));
        creerCompte(new CompteBancaire("Georges Harrisson", 100000));
        creerCompte(new CompteBancaire("Sophie", 150000));
        creerCompte(new CompteBancaire("Aurelie", 950000));
        creerCompte(new CompteBancaire("Marie", 20000));
        creerCompte(new CompteBancaire("Sarah", 100000));
        creerCompte(new CompteBancaire("Amaury", 150000));
        creerCompte(new CompteBancaire("Oliv", 950000));
        creerCompte(new CompteBancaire("Bruno", 20000));
        creerCompte(new CompteBancaire("Theo", 100000));
        
    }

    public void addCompte(String nom, long solde) {
        creerCompte(new CompteBancaire(nom, solde));
    }

    public CompteBancaire supprimerCompte(int id) {
        CompteBancaire c = getCompteById(id);
        if (c != null) {
            em.remove(c);
        }
        return c;
    }

    public CompteBancaire modifierCompte(int id, String nouveauNom, long nouveauSolde) {
        CompteBancaire c = getCompteById(id);
        if (c != null) {
            c.setNomProprietaire(nouveauNom);
            c.setSoldeCompte(nouveauSolde);
        }
        return c;
    }

    public CompteBancaire getCompteById(int id) {
        CompteBancaire c = null;
        // requete
        Query q = getEm().createQuery("select c from CompteBancaire c where c.id='" + id + "'");
        try {
            c = (CompteBancaire) q.getSingleResult();
        } catch (NoResultException e) {
            System.out.println("Pas de compte avec ce mail : " + id);
        }
        return c;
    }

    public CompteBancaire versementCompte(int id, long montant) {
        CompteBancaire c = getCompteById(id);
        if (c != null) {
            c.ajouterArgent(montant);
        }
        return c;
    }

    public CompteBancaire retraitCompte(int id, long montant) {
        CompteBancaire c = getCompteById(id);
        if (c != null) {
            c.retirerArgent(montant);
        }
        return c;
        
    }

    public void virementCompte(int idDebiteur, int idCrediteur, long montant) {
        CompteBancaire compteDebiteur = getCompteById(idDebiteur);
        CompteBancaire compteCrediteur = getCompteById(idCrediteur);
        if ((compteDebiteur != null) && (compteCrediteur != null)) {
            compteDebiteur.retirerArgent(montant);
            compteCrediteur.ajouterArgent(montant);
        }
    }
    
     public List<Long> getCompteBancaire() {  
        Query query = em.createQuery("SELECT c.id FROM CompteBancaire c");  
        return query.getResultList();  
    }  

    /**
     * @return the em
     */
    public EntityManager getEm() {
        return em;
    }

    /**
     * @param em the em to set
     */
    public void setEm(EntityManager em) {
        this.em = em;
    }
}
